<?php

if (!function_exists('pre')) {
    /**
     * 打印数组
     * @param Array $data 需要打印数组
     * @return String 返回字符串
     */
    function pre($data)
    {
        echo '<pre>';
        var_dump($data);
        echo '</pre>';
    }
}

if (!function_exists('ShowMsg')) {
    /**
     * 跳转提示函数
     * @param String 提示信息
     * @param String 跳转地址
     * @return String 输出字符串
     */
    function ShowMsg($msg, $url = null)
    {
        if ($url) {
            echo "<script>alert('$msg');location.href = '$url';</script>";
            exit;
        } else {
            echo "<script>alert('$msg');history.go(-1);</script>";
            exit;
        }
    }
}

if (!function_exists('find')) {
    /**
     * 查询单条数据
     * @param String $sql 执行sql语句
     * @return Array 返回结果集
     */
    function find($sql)
    {
        // 声明全局变量
        global $conn;

        // 执行sql语句
        $result = mysqli_query($conn, $sql);

        // 存放查询数据的数组
        $data = [];

        // 判断查询结果是否有数据
        if ($result && mysqli_num_rows($result) > 0) {
            $data = mysqli_fetch_assoc($result);
        }

        return $data;
    }
}

if (!function_exists('add')) {
    /**
     * 新增数据
     * @param String $table 表名
     * @param Array $data 新增的数据
     * @param String $prefix 表前缀
     * 
     */
    function add($table, $data, $prefix = 'stu_')
    {
        // 声明全局变量
        global $conn;

        // 拼接表名
        $table = $prefix . $table;

        // 获取所有的字段
        $fieldArr = array_keys($data);

        // `username`,`password`,`salt` 字段数组转成字段字符
        $fieldStr = "`" . implode("`,`", $fieldArr) . "`";

        // 'demo','78ae505ff840eadce34546beca76a8d1','ThDGklbU' 字段值的数组转成字段值的字符
        $valuesStr = "'" . implode("','", $data) . "'";

        // INSERT INTO `pre_admin`(`field`)VALUES('value')
        $sql = "INSERT INTO `$table`($fieldStr)VALUES($valuesStr)";

        // 执行语句
        $result = mysqli_query($conn, $sql);

        if ($result) {
            return mysqli_insert_id($conn);
        } else {
            echo '执行失败的sql语句：' . $sql;
            exit;
        }
    }
}

if (!function_exists('all')) {
    /**
     * 查询多条数据
     * @param String $Sql 查询语句
     * @return Array 返回结果集
     */
    function all($sql)
    {
        // 声明全局变量
        global $conn;

        // 返回数据的数组
        $list = [];

        // 执行查询语句
        $result = mysqli_query($conn, $sql);

        if ($result && mysqli_num_rows($result) > 0) {
            while ($data = mysqli_fetch_assoc($result)) {
                $list[] = $data;
            }
        }

        return $list;
    }
}

if (!function_exists('update')) {
    /**
     * 更新数据函数
     * @param String $table 表名
     * @param Array $data 更新数据
     * @param String $where 更新条件
     * @param String $prefix 表前缀
     */
    function update($table, $data, $where = 1, $prefix = 'stu_')
    {
        global $conn;

        $table = $prefix . $table;

        // UPDATE `pre_admin` SET `字段` = '值'

        $field = '';

        foreach ($data as $key => $val) {
            $field .= '`' . $key . '`' . '=' . "'" . $val . "'" . ',';
        }

        $field = rtrim($field, ',');

        $sql = "UPDATE `{$table}` SET $field WHERE $where";

        $result = mysqli_query($conn, $sql);

        if ($result) {
            return mysqli_affected_rows($conn);
        } else {
            echo '执行失败的sql语句：' . $sql;
            exit;
        }
    }
}

if (!function_exists('delete'))
{
    /**
     * 删除数据
     * @param String $table 表名
     * @param String $where 删除数据的条件
     * @param String $prefix 表前缀
    */
    function delete($table,$where = 1,$prefix = 'stu_')
    {
        global $conn;

        $table = $prefix.$table;

        // DELETE FROM `表名` WHERE `id` = id
        $sql = "DELETE FROM `{$table}` WHERE $where";

        $result = mysqli_query($conn,$sql);

        if($result)
        {
            return mysqli_affected_rows($conn);
        }else{
            echo '执行失败的sql语句：' . $sql;
            exit;
        }
    }
}

if (!function_exists('upload_img')) {
    /**
     * 上传单图
     * @param String $name 图片名称
     * @param String $path 指定存放目录
     * @param Array $type 图片类型
     * @param Int $size 图片大小
     * @return Array 返回结果集
     */
    function upload_img($name, $path = 'uploads', $type = ['jpg', 'jpeg', 'png', 'gif'], $size = 1048576)
    {
        // 返回结果集的数组
        $result = [
            'msg' => '未知信息', // 提示信息
            'code' => 0, // 0 => 失败 1 => 成功
            'data' => null, // 返回数据
        ];

        // 判断指定目录是否存在
        if (!is_dir($path)) {
            // 能走这里就说明了文件夹不存在，所以需要创建文件夹
            mkdir($path, 0777, true);
        }

        // 获取错误码
        $ErrorCode = $_FILES[$name]['error'];

        // 判断错误类型
        switch ($ErrorCode) {
            case 1:
                $result['msg'] = '上传大小不能超过upload_max_filesize设置的值';
                return $result;
                break;
            case 2:
                $result['msg'] = '上传大小不能超过MAX_FILE_SIZE设置的值';
                return $result;
                break;
            case 3:
                $result['msg'] = '图片上传不完整';
                return $result;
                break;
            case 4:
                $result['msg'] = '没有选择图片';
                return $result;
                break;
        }

        // 获取文件后缀 png jpg
        $ext = pathinfo($_FILES[$name]['name'], PATHINFO_EXTENSION);

        // 判断图片类型是否不在类型数组里
        if (!in_array($ext, $type)) {
            $result['msg'] = '上传的图片类型错误';
            return $result;
        }

        // 获取文件大小
        $FileSize = $_FILES[$name]['size'];

        // 判断文件是否过大
        if ($FileSize > $size) {
            $result['msg'] = '图片过大,请压缩后上传';
            return $result;
        }

        // 定义保存后的文件名 格式：202332417163012345678.png
        $FileName = date('YmdHis', time()) . mt_rand(1000, 9999) . mt_rand(1000, 9999) . '.' . $ext;

        // 判断文件是否通过http POST 上传
        if (is_uploaded_file($_FILES[$name]['tmp_name'])) {
            if (move_uploaded_file($_FILES[$name]['tmp_name'], $path . '/' . $FileName)) {
                $result = [
                    'msg' => '上传图片成功',
                    'code' => 1,
                    'data' => $path . '/' . $FileName
                ];
            } else {
                $result['msg'] = '上传图片失败';
            }
        } else {
            $result['msg'] = '图片上传错误';
        }

        return $result;
    }
}

if (!function_exists('build_ranstr')) {
    /**
     * 获得随机字符串
     * @param   Number  $len    需要的长度
     * @param   Bool    $special    是否需要特殊符号
     * @return  String  返回随机字符串
     */
    function build_ranstr($len = 8, $special = false)
    {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );

        if ($special) {
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                "}", "<", ">", "~", "+", "=", ",", "."
            ));
        }

        $charsLen = count($chars) - 1;
        shuffle($chars); //打乱数组顺序
        $str = ''; // 用来拼接的
        for ($i = 0; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }
        return $str;
    }
}

if (!function_exists('auth')) {
    /**
     * 验证并且获取登录信息
     */
    function auth()
    {
        // 获取登录信息
        $LoginAdmin = isset($_COOKIE['LoginAdmin']) ? json_decode($_COOKIE['LoginAdmin'], true) : [];

        // 当cookie不存在需要跳转登录页
        if (!$LoginAdmin) {
            ShowMsg('请先登录', 'login.php');
        }

        // 获取登录用户的id 如果id字段不存在就返回0
        $id = isset($LoginAdmin['id']) ? $LoginAdmin['id'] : 0;

        // 根据id查询数据库是否有这个用户
        $Sql = "SELECT * FROM `stu_admin` WHERE `id` = '$id'";

        // 返回结果
        $LoginAdmin = find($Sql);

        // 如果返回false || 空的数组 cookie是假的
        if (!$LoginAdmin) {
            // 清除假的cookie
            setcookie('LoginAdmin', '', time() - 1);
            ShowMsg('非法登录，请重新登录', 'login.php');
        }

        return $LoginAdmin;
    }
}

if (!function_exists('getUrl')) {
    /**
     * 获取完整地址
     */
    function getUrl()
    {
        // 获取当前的地址
        $url = $_SERVER['PHP_SELF'] . '?';

        if ($_GET) {
            foreach ($_GET as $key => $val) {
                if ($key != 'page') {
                    $url .= $key . '=' . $val . '&';
                }
            }
        }

        return $url;
    }
}

if (!function_exists('page')) {
    /**
     * 输出分页函数
     * @param $current 当前页
     * @param $count   记录总数(查询数据表的总数)
     * @param $limit   每页显示多少条
     * @param $size    显示页码
     * @param $class   样式
     */
    function page($current, $count, $limit, $size, $class = 'digg')
    {
        $page = '';

        // 判断是否显示分页
        if ($count > $limit) {
            // 总分页
            $pages = ceil($count / $limit);

            // 获取地址
            $url = getUrl();

            $page .= '<div class="' . $class . '">';

            // 首页 上一页
            if ($current == 1) {
                $page .= '<span class="disabled">首&nbsp;页</span>';
                $page .= '<span class="disabled">上一页</span>';
            } else {
                $page .= '<a href="' . $url . 'page=1">首&nbsp;页</a>';
                $page .= '<a href="' . $url . 'page=' . ($current - 1) . '">上一页</a>';
            }

            // 中间部分显示页码，  取的页码范围
            if ($current <= floor($size / 2)) {
                // 当前页在中间位置靠左,floor()向下取整
                $start  =  1;
                // 如果总页数大于中间显示多少页,结束数字就是中间显示多少页的数字,否则结束数字就是总页数
                $end = $pages < $size ? $pages : $size;
            } else if ($current >= $pages - floor($size / 2)) {
                // 当前页在中间位置靠右 避免页数出现0或者负数
                $start = $pages - $size + 1 <= 0 ? 1 : $pages - $size + 1;
                $end = $pages;
            } else {
                // 当前页刚好在中间位置
                $start = $current - floor($size / 2);
                $end = $current + floor($size / 2);
            }

            for ($i = $start; $i <= $end; $i++) {
                if ($i == $current) {
                    $page .= '<span class="current">' . $i . '</span>';
                } else {
                    $page .= '<a href="' . $url . 'page=' . $i . '">' . $i . '</a>';
                }
            }


            // 下一页 尾页
            if ($pages == $current) {
                $page .= '<span class="disabled">下一页</span>';
                $page .= '<span class="disabled">尾&nbsp;页</span>';
            } else {
                $page .= '<a href="' . $url . 'page=' . ($current + 1) . '">下一页</a>';
                $page .= '<a href="' . $url . 'page=' . $pages . '">尾&nbsp;页</a>';
            }

            $page .= '</div>';
        }

        return $page;
    }
}


if(!function_exists('success'))
{
    /**
     * 操作成功的函数
     * @param String $msg 提示信息
     * @param Array $data 返回数据
     * @param Int $code 状态码
    */
    function success($msg,$data = null,$code = 1)
    {
        $result = [
            'msg' => $msg,
            'data' => $data,
            'code' => $code
        ];

        echo json_encode($result);
        exit;
    }
}

if(!function_exists('error'))
{
    /**
     * 操作成功的函数
     * @param String $msg 提示信息
     * @param Array $data 返回数据
     * @param Int $code 状态码
    */
    function error($msg,$data = null,$code = 0)
    {
        $result = [
            'msg' => $msg,
            'data' => $data,
            'code' => $code
        ];

        echo json_encode($result);
        exit;
    }
}